/* eslint-disable */
import XLSX from 'xlsx';

function auto_width(ws, data) {
    /*set worksheet max width per col*/
    const colWidth = data.map(row => row.map(val => {
        /*if null/undefined*/
        if (val == null) {
            return { 'wch': 10 };
        }
        /*if chinese*/
        else if (val.toString().charCodeAt(0) > 255) {
            return { 'wch': val.toString().length * 2 };
        } else {
            return { 'wch': val.toString().length };
        }
    }))
    /*start in the first row*/
    let result = colWidth[0];
    for (let i = 1; i < colWidth.length; i++) {
        for (let j = 0; j < colWidth[i].length; j++) {
            if (result[j]['wch'] < colWidth[i][j]['wch']) {
                result[j]['wch'] = colWidth[i][j]['wch'];
            }
        }
    }
    ws['!cols'] = result;
}


function json_to_array(key, jsonData) {
    return jsonData.map((v, index) => key.map(j => {
        if (j == 'index') {
            return (index + 1);
        }
        return v[j]
    }));
}
// fix data,return string
function fixdata(data) {
    let o = ''
    let l = 0
    const w = 10240
    for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)))
    o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)))
    return o
}

// get head from excel file,return array
function get_header_row(sheet) {
    const headers = []
    const range = XLSX.utils.decode_range(sheet['!ref'])
    let C
    const R = range.s.r /* start in the first row */
    for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */
        var cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })] /* find the cell in the first row */
        var hdr = 'UNKNOWN ' + C // <-- replace with your desired default
        if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)
        headers.push(hdr)
    }
    return headers
}

export const export_table_to_excel = (id, filename) => {
    const table = document.getElementById(id);
    const wb = XLSX.utils.table_to_book(table);
    XLSX.writeFile(wb, filename);
 
}

export const export_json_to_excel = ({ data, key, title, filename, autoWidth }) => {
    const wb = XLSX.utils.book_new();
    data.unshift(title);
    const ws = XLSX.utils.json_to_sheet(data, { header: key, skipHeader: true });
    if (autoWidth) {
        const arr = json_to_array(key, data);
        auto_width(ws, arr);
    }
    if(filename.length>30){
        filename=filename.substr(0,30)
    }
    XLSX.utils.book_append_sheet(wb, ws, filename);
    XLSX.writeFile(wb, filename + '.xlsx');
}

export const export_array_to_excel = ({ key, data, title, filename, autoWidth }) => {
    const wb = XLSX.utils.book_new();
    const arr = json_to_array(key, data);
    arr.unshift(title);
    const ws = XLSX.utils.aoa_to_sheet(arr);
    if (autoWidth) {
        auto_width(ws, arr);
    } 
    if(filename.length>30){
        filename=filename.substr(0,30)
    }
    XLSX.utils.book_append_sheet(wb, ws, filename);
    XLSX.writeFile(wb, filename + '.xlsx');
}

export const read = (data, type) => { 
    const workbook = XLSX.read(data, { type: type });
    const firstSheetName = workbook.SheetNames[0];
    const worksheet = workbook.Sheets[firstSheetName];
    const header = get_header_row(worksheet);
    const results = XLSX.utils.sheet_to_json(worksheet);
    return { header, results };
}

export const readtitle = (data, type, headerlist) => {
    const workbook = XLSX.read(data, { type: type });
    const firstSheetName = workbook.SheetNames[0];
    const worksheet = workbook.Sheets[firstSheetName];
    const header = get_header_row(worksheet);
    deleteRow(worksheet, 0); 
    const results = XLSX.utils.sheet_to_json(worksheet, { header: headerlist });
    return { header, results };
}
function encodeCell(r, c) {
    return XLSX.utils.encode_cell({ r, c });
}

function deleteRow(ws, index) {
    const range = XLSX.utils.decode_range(ws['!ref']);

    for (let row = index; row < range.e.r; row++) {
        for (let col = range.s.c; col <= range.e.c; col++) {
            ws[encodeCell(row, col)] = ws[encodeCell(row + 1, col)];
        }
    }

    range.e.r--;

    ws['!ref'] = XLSX.utils.encode_range(range.s, range.e);
}

export const export_array_to_excel_more = ({ key, data, title, filename, autoWidth }) => {
    if (filename.length > 31) {
        filename = filename.substr(0, 30)
    }
    const wb = XLSX.utils.book_new();
    for (var i = 0; i < data.length; i++) {
        const arr = json_to_array(key, data[i]);
        arr.unshift(title);
        var groupTag = data[i][0].GroupTag;
        var us = [];
        us.push(groupTag);
        const ws = XLSX.utils.aoa_to_sheet(arr);
        if (autoWidth) {
            auto_width(ws, arr);
        }
        XLSX.utils.book_append_sheet(wb, ws, groupTag);
    }
    XLSX.writeFile(wb, filename + '.xlsx');
}
 

export default {
    export_table_to_excel,
    export_array_to_excel,
    export_json_to_excel,
    read,
    readtitle,
    export_array_to_excel_more, 
}
